<!DOCTYPE html>
<!-- saved from url=(0127)https://docs.google.com/document/d/e/2PACX-1vTzcPIBF1ZbjuE1bq2ScuUKhbV0YDjUWGaa5220_1DrgbnUFymaIx2yOYlgZIVCOzDN3z4gnZL46eXo/pub -->
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>WebPerfWG call - Feb 27 2020</title><link rel="shortcut icon" href="https://ssl.gstatic.com/docs/documents/images/kix-favicon7.ico"><meta name="referrer" content="strict-origin-when-cross-origin"><style type="text/css" nonce="">
      @import url("https://fonts.googleapis.com/css?family=Google+Sans");
      @import url("https://fonts.googleapis.com/css?family=Roboto");

      body {
        font-family: Roboto, arial, sans, sans-serif;
        margin: 0;
      }

      iframe {
        border: 0;
        frameborder: 0;
        height: 100%;
        width: 100%;
      }

      #header {
        align-items: center;
        background: white;
        border-bottom: 1px #ccc solid;
        display: flex;
        height: 60px;
        justify-content: space-between;
        position: fixed;
        top: 0;
        width: 100%;
        z-index: 100;
      }

      #header #title {
        font-family: 'Google Sans';
        font-size: large;
        margin: auto 0 auto 20px;
        overflow: hidden;
        text-overflow: ellipsis;
        white-space: nowrap;
        width: 70%;
      }

      #header #interval {
        margin: auto 25px auto 0;
        font-family: Roboto;
        font-size: small;;
      }

      #footer {
        background: #f0f0f0;
        border-bottom: 1px #ccc solid;
        bottom: 0;
        font-family: Roboto;
        font-size: small;
        padding: 10px 10px;
        position: fixed;
        text-align: center;
        width: 100%;
      }

      #contents {
        padding: 100px 20% 50px 20%;
      }

      @media only screen and (max-device-width: 800px) {
        #header {
          border-bottom-width: 5px;
          height: auto;
          display: block;
        }

        #header #title {
          font-size: 3em;
          margin: auto 0 auto 20px;
          width: 90%;
        }

        #header #interval {
          font-size: 1.5em;
          margin: 10px 0 auto 25px;
        }

        #contents {
          padding: 150px 5% 80px;
        }

        #footer {
          font-size: 2em;
        }
      }

      .dash {
        padding: 0 6px;
      }
    </style></head><body><div id="header"><div id="title">WebPerfWG call - Feb 27 2020</div><div id="interval"><span></span></div></div><div id="contents"><style type="text/css">.lst-kix_umejnuaq0qyg-7>li:before{content:"\0025cb  "}.lst-kix_umejnuaq0qyg-1>li:before{content:"\0025cb  "}li.li-bullet-0:before{margin-left:-18pt;white-space:nowrap;display:inline-block;min-width:18pt}.lst-kix_umejnuaq0qyg-8>li:before{content:"\0025a0  "}.lst-kix_umejnuaq0qyg-0>li:before{content:"\0025cf  "}.lst-kix_umejnuaq0qyg-3>li:before{content:"\0025cf  "}ul.lst-kix_umejnuaq0qyg-0{list-style-type:none}ul.lst-kix_umejnuaq0qyg-1{list-style-type:none}ul.lst-kix_umejnuaq0qyg-2{list-style-type:none}.lst-kix_umejnuaq0qyg-5>li:before{content:"\0025a0  "}ul.lst-kix_umejnuaq0qyg-3{list-style-type:none}.lst-kix_umejnuaq0qyg-2>li:before{content:"\0025a0  "}ul.lst-kix_umejnuaq0qyg-4{list-style-type:none}.lst-kix_umejnuaq0qyg-6>li:before{content:"\0025cf  "}ul.lst-kix_umejnuaq0qyg-5{list-style-type:none}ul.lst-kix_umejnuaq0qyg-6{list-style-type:none}ul.lst-kix_umejnuaq0qyg-7{list-style-type:none}ul.lst-kix_umejnuaq0qyg-8{list-style-type:none}.lst-kix_umejnuaq0qyg-4>li:before{content:"\0025cb  "}ol{margin:0;padding:0}table td,table th{padding:0}.c0{color:#000000;font-weight:400;text-decoration:none;vertical-align:baseline;font-size:11pt;font-family:"Arial";font-style:normal}.c7{color:#000000;font-weight:400;text-decoration:none;vertical-align:baseline;font-size:16pt;font-family:"Arial";font-style:normal}.c5{padding-top:18pt;padding-bottom:6pt;line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}.c1{padding-top:0pt;padding-bottom:0pt;line-height:1.15;orphans:2;widows:2;text-align:left}.c8{text-decoration-skip-ink:none;-webkit-text-decoration-skip:none;color:#1155cc;text-decoration:underline}.c10{background-color:#ffffff;max-width:468pt;padding:72pt 72pt 72pt 72pt}.c4{margin-left:36pt;padding-left:0pt}.c6{color:inherit;text-decoration:inherit}.c9{padding:0;margin:0}.c2{margin-left:72pt;padding-left:0pt}.c11{height:11pt}.c3{font-weight:700}.title{padding-top:0pt;color:#000000;font-size:26pt;padding-bottom:3pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}.subtitle{padding-top:0pt;color:#666666;font-size:15pt;padding-bottom:16pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}li{color:#000000;font-size:11pt;font-family:"Arial"}p{margin:0;color:#000000;font-size:11pt;font-family:"Arial"}h1{padding-top:20pt;color:#000000;font-size:20pt;padding-bottom:6pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h2{padding-top:18pt;color:#000000;font-size:16pt;padding-bottom:6pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h3{padding-top:16pt;color:#434343;font-size:14pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h4{padding-top:14pt;color:#666666;font-size:12pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h5{padding-top:12pt;color:#666666;font-size:11pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h6{padding-top:12pt;color:#666666;font-size:11pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;font-style:italic;orphans:2;widows:2;text-align:left}</style><div class="c10"><h2 class="c5" id="h.tp8vgbxwmuh6"><span class="c7">Participants</span></h2><p class="c1"><span class="c0">Alex Christensen, Vivek Sekhar, Nicol&aacute;s Pe&ntilde;a, Ryosuke Niwa, Benjamin de Kosnik, Steven Bougon, Gilles Dubusc, Philippe Le Hegaret, Ilya Grigorik, Yoav Weiss, Subrata Ashe</span></p><p class="c1 c11"><span class="c0"></span></p><h2 class="c5" id="h.kmwydcovulrn"><span class="c7">F2F</span></h2><ul class="c9 lst-kix_umejnuaq0qyg-0 start"><li class="c1 c4 li-bullet-0"><span class="c0">Corona is a risk</span></li><li class="c1 c4 li-bullet-0"><span class="c0">Investigate online alternatives</span></li><li class="c1 c4 li-bullet-0"><span class="c0">Remote participation</span></li><li class="c1 c4 li-bullet-0"><span class="c0">Monitor the situation</span></li><li class="c1 c4 li-bullet-0"><span class="c0"><b>PLH</b>: working on online alternative to F2F</span></li></ul><ul class="c9 lst-kix_umejnuaq0qyg-1 start"><li class="c1 c2 li-bullet-0"><span class="c0">Smaller chunks of time rather than full days</span></li></ul><h2 class="c5" id="h.c4rv8o1djq1o"><span class="c8"><a class="c6" href="https://www.google.com/url?q=https://github.com/vsekhar/browser-ablation&amp;sa=D&amp;source=editors&amp;ust=1613234837503000&amp;usg=AOvVaw00WTw_fuTpkArWw9nv7E2f">Ablation experiments</a></span></h2><p class="c1"><span class="c3">Vivek:</span><span class="c0">&nbsp;Motivation is justifying investment in performance</span></p><p class="c1"><span class="c0">… Some sites are sensitive for FCP, others are more sensitive to FID and CLS</span></p><p class="c1"><span class="c0">… Understanding the motivation for an individual property to invest in performance is critical</span></p><p class="c1"><span class="c0">… The mechanism in the browser is focused on getting ablation - artificially inserted delays - to . see the impact of that delay.</span></p><p class="c1"><span class="c0">… Better than performing those same delays in JS</span></p><p class="c1"><span class="c0">… The mechanism is to provide what delays are needed and when</span></p><p class="c1"><span class="c0">… But the idea is for an analytics provider to be able to inject ablation to measure how sensitive would the site’s business metrics be to performance impact</span></p><p class="c1"><span class="c3">Ryosuke</span><span class="c0"><b></b>: So ability to add artificial delay to the metrics measured?</span></p><p class="c1"><span class="c3">Vivek</span><span class="c0"><b></b>: delaying the UX, reflected in metrics</span></p><p class="c1"><span class="c3">Ryosuke</span><span class="c0"><b></b>: So actually making things slower?</span></p><p class="c1"><span class="c3">Vivek</span><span class="c0"><b></b>: yeah, artificially making things slower to a small group of users to measure impact</span></p><p class="c1"><span class="c3">Ryosuke</span><span class="c0"><b></b>: Why can’t that be done in script?</span></p><p class="c1"><span class="c3">Vivek</span><span class="c0"><b></b>: some can be done in script, but some can’t. (e.g. delay the initial JS load). Otherwise, some of those metrics are hard to effect directly, and that can reduce their statistical value</span></p><p class="c1"><span class="c3">Benjamin</span><span class="c0"><b></b>: can this be used for memory footprint?</span></p><p class="c1"><span class="c3">Vivek</span><span class="c0"><b></b>: we’ve done that internally. No details right now. </span></p><p class="c1"><span class="c3">Ben</span><span class="c0"><b></b>: interested in details on that. Let me know if you can share</span></p><p class="c1"><span class="c3">Vivek</span><span class="c0"><b></b>: Important to understand which aspects of performance are made possible by this. Can add those to the proposal.</span></p><p class="c1"><span class="c3">Benjamin</span><span class="c0"><b></b>: Would you be interested in separating browser memory from JS memory? When I envision it used at Mozilla, this is how I’d use it.</span></p><p class="c1"><span class="c3">Steven</span><span class="c0"><b></b>: For salesforce it won’t be a useful API, because we don’t have conversion metrics. Delaying the UX won’t help much. Nic Jansma commented online that this will be useful for Akamai.</span></p><p class="c1"><span class="c3">Gilles</span><span class="c0"><b></b>: It sounds interesting. For us it can be useful even for synthetic testing. Definitely something we would play with. This will make it easier to try out ablation. Thumbs up from me.</span></p><p class="c1"><span class="c3">Steven</span><span class="c0"><b></b>: For Wikipedia’s case, you’d add a delay to 10% of your population - what will you look at? Drop in visits and session length?</span></p><p class="c1"><span class="c3">Gilles</span><span class="c0"><b></b>: yeah</span></p><p class="c1"><span class="c3">Steven</span><span class="c0"><b></b>: how would it help you to improve your site?</span></p><p class="c1"><span class="c3">Gilles</span><span class="c0"><b></b>: If we can apply it to many different metrics, it can tell us which metrics are more important than others. E.g. FID is a new metric and we don’t know if it’s important or not.</span></p><p class="c1"><span class="c0">… Currently hard to say which metric matters most, and this will help prioritize. We have engineers pushing features, and we need to make tough choices about metrics we care about. This can help on that front.</span></p><p class="c1"><span class="c0">… With anecdata we can get some of it, but this can help us explore extreme scenarios which may not happen naturally in the field.</span></p><p class="c1"><span class="c0">… Example: someone came up with metric that measures the amount of times things changed. … Does avoiding many paints matter? With something like this we could explore something like that. Would help to make sense of the weights of steps in UX and how it impacts engagement.</span></p><p class="c1"><span class="c3">Steven</span><span class="c0"><b></b>: thank you.</span></p><p class="c1"><span class="c3">Vivek</span><span class="c0"><b></b>: So as part of a multi-step flow, apply delay on different steps and see which step matters</span></p><p class="c1"><span class="c3">Gilles</span><span class="c0"><b></b>: Also about unrelated metrics, see which one matters. Easy to focus on loading pages faster, but not sure it’s the right thing.</span></p><p class="c1"><span class="c0">… Should we improve the median or should we focus on the extreme scenario? By definition the extreme doesn’t happen often so hard to gather data</span></p><p class="c1"><span class="c0">This can shift the focus towards higher percentiles</span></p><h2 class="c5" id="h.stiujndp6kw8"><span class="c7">Resource Timing and Timing Allow Origin</span></h2><p class="c1"><span class="c3">Yoav</span><span class="c0"><b></b>: there are fundamental issues with TAO. </span></p><p class="c1"><span>… One of them is related to nextHopProtocol: see </span><span class="c8"><a class="c6" href="https://www.google.com/url?q=https://github.com/w3c/resource-timing/issues/221&amp;sa=D&amp;source=editors&amp;ust=1613234837533000&amp;usg=AOvVaw0CDk2pZK7l0VwfSJBEdr-T">issue</a></span><span class="c0">. And then there are other issues related to the fact that nextHopProtocol is not TAO protected at all. </span></p><p class="c1"><span>… Pending </span><span class="c8"><a class="c6" href="https://www.google.com/url?q=https://github.com/w3c/resource-timing/pull/224&amp;sa=D&amp;source=editors&amp;ust=1613234837535000&amp;usg=AOvVaw0dGkILHPGqHfcxAUc3ASva">PR</a></span><span class="c0">&nbsp;for partially protecting it for iframe resources, but perhaps the right approach is to fully protect it. Besides that, TAO is not necessarily the right opt-in for some of the things that are currently exposed under Resource Timing. </span></p><p class="c1"><span class="c0">… CORP could be the gate to allow memory measurement. Exposing transfer sizes has similar characteristics to the information that, for example, memory measurement can expose. So it seems that we would need to modify some of the opt-ins. </span></p><p class="c1"><span class="c0">… We need to clarify which characteristics of each of the metrics fits which opt-ins. </span></p><p class="c1"><span>… Timing allow check would be implied by CORS opt-ins, and should also be implied by CORS opt-ins. But some of the information we expose by TAO doesn’t fit the risk model of timing very well.</span></p><p class="c1"><span class="c3">Ryosuke</span><span class="c0"><b></b>: where are these concrete concerns?</span></p><p class="c1"><span class="c3">Yoav</span><span class="c0"><b></b>: issue 221 regarding nextHopProtocol. It can tell things about the user. If a user is in a network that has an MITN terminator or antivirus, there are cases where this value could reveal details about the user’s network.</span></p><p class="c1"><span class="c3">Ryosuke</span><span class="c0"><b></b>: that’s not a cross-origin issue.</span></p><p class="c1"><span class="c3">Yoav</span><span class="c0"><b></b>: that one is not, though there are some cross-origin issues around service workers.</span></p><p class="c1"><span class="c3">Ryosuke</span><span class="c0"><b></b>: what are those concerns?</span></p><p class="c1"><span class="c3">Yoav</span><span class="c0"><b></b>: whether service worker is installed or not can be inspected by creating an iframe and inspecting the nextHopProtocol of that.</span></p><p class="c1"><span class="c3">Ryosuke</span><span class="c0"><b></b>: a.com loads b.com and can deduce if it has a service worker. Only an issue without double key caching?</span></p><p class="c1"><span class="c3">Yoav</span><span class="c0"><b></b>: yea, partitioning makes that specific concern go away.</span></p><p class="c1"><span class="c3">Ryosuke</span><span class="c0"><b></b>: if a.com has a random image, it won’t use service worker.</span></p><p class="c1"><span class="c3">Yoav</span><span class="c0"><b></b>: if it’s a subresource, it goes through a.com’s service worker. If it’s within iframe, then it will use b.com’s service worker.</span></p><p class="c1"><span class="c3">Ryosuke</span><span class="c0"><b></b>: You could still detect if a site has a SW if registration happened in iframe, but there’s no information leak there. I guess that if a client certificate authenticates a website, and the SW is only installed in the authenticated case that could be detectable across origins.</span></p><p class="c1"><span class="c3">Yoav</span><span class="c0"><b></b>: not something websites would do. You could detect if a website has sw, but that’s not sensitive information.</span></p><p class="c1"><span class="c3">Ryosuke</span><span class="c0"><b></b>: unless the presence is predicated on some user login. If we have a resource inside an iframe, we do not report that resource. So only iframe itself could expose the presence. Did we lock load events for iframes in cross origin cases?</span></p><p class="c1"><span class="c3">Yoav</span><span class="c0"><b></b>: if you can successfully block that, some people will be very happy. But it does fire at the moment. And I expect compat issues if it stopped firing.</span></p><p class="c1"><span class="c0">… Ok, so there’s nextHopProtocol, and the general history leaks described by the PING. </span></p><p class="c1"><span>… They have multiple scenarios, most of which go away with partitioning, except for one of them, which is extracting information about cookies being sent: issue </span><span class="c8"><a class="c6" href="https://www.google.com/url?q=https://github.com/w3c/resource-timing/issues/222&amp;sa=D&amp;source=editors&amp;ust=1613234837549000&amp;usg=AOvVaw0wnqCYq6joxC8sjwswM99w">222</a></span><span class="c0">.</span></p><p class="c1"><span class="c0">... Exposing transfer sizes for credentialed resources means that length of cookies can be deduced, and various things can be concluded from that. </span></p><p class="c1"><span class="c0">… The PING folks suggested blocking wildcard from TAO, which doesn’t make sense and doesn’t solve the issue. </span></p><p class="c1"><span class="c0">… Perhaps we can modify transfer sizes to exclude cookies. Alternatively, we’d gate those on something like CORP. </span></p><p class="c1"><span class="c0">… One complaint is that new stuff (not just timing but other dimensions) was added between L1 and L2, but the opt-in remained the same.</span></p><p class="c1"><span class="c3">npm</span><span class="c0"><b></b>: do people agree that getting rid of TAO * is the wrong solution there?</span></p><p class="c1"><span class="c3">Ilya</span><span class="c0"><b></b>: yea, those are orthogonal issues.</span></p><p class="c1"><span class="c3">Ryosuke</span><span class="c0"><b></b>: for transferSize, sure, but there’s also a couple of other issues. I don’t think.</span></p><p class="c1"><span class="c3">Yoav</span><span class="c0"><b></b>: three solved by partitioning, the last is the cookie one. Blocking TAO * won’t solve any of those problems.</span></p><p class="c1"><span class="c3">Ryosuke</span><span class="c0"><b></b>: So you claim the only issue we should look at is the cookie issue?</span></p><p class="c1"><span class="c3">Yoav</span><span class="c0"><b></b>: everything else will be resolved by partitioning in all modern browsers very soon. I’m assuming it includes DNS and network connection. That’s the plan for Chrome, but worthwhile to verify this is the case in Safari and Firefox.</span></p><p class="c1"><span class="c3">Ryosuke</span><span class="c0"><b></b>: I don’t know.</span></p><p class="c1"><span class="c3">Yoav</span><span class="c0"><b></b>: assuming we have agreement on TAO * being the wrong solution, do we have agreement on making sure that excluding cookies is the right solution? Or other opt-ins? Is this something you need to take some time to review?</span></p><p class="c1"><span class="c3">Ryosuke</span><span class="c0"><b></b>: the DNS cache is an issue: we don’t want that information to be exposed. Same thing with HSTS, and reused connection. There’s a privacy aspect of this being used as a tracking vector. Removing TAO * won’t help though.</span></p><p class="c1"><span class="c3">Yoav</span><span class="c0"><b></b>: could you look into the proposed mitigation, which is to eliminate cookie sizes from the response?</span></p><p class="c1"><span class="c3">Ryosuke</span><span class="c0"><b></b>: we don’t implement transferSize due to that security issue.</span></p><p class="c1"><span class="c3">Yoav</span><span class="c0"><b></b>: Is that the only blocker?</span></p><p class="c1"><span class="c3">Ryosuke</span><span class="c0"><b></b>: I don’t know, I think there’s a couple others.</span></p><p class="c1"><span class="c3">Yoav</span><span class="c0"><b></b>: can you document those concerns?</span></p><p class="c1"><span class="c3">Ryosuke</span><span><b></b>: at some point, yes.</span></p></div></div><div id="footer"><span>Published by <a target="_blank" title="Learn more about Google Drive" href="https://docs.google.com/">Google Drive</a></span><span class="dash">–</span><a href="https://docs.google.com/u/0/abuse?id=AKkXjowyhCtd-qcuOKLN5-jMeNxdI17of5XgurH0IR1WiWHfhuqmfnkRT-XauLb453LYsp3P2zelmKIUX9jAIq8:0">Report Abuse</a></div><script type="text/javascript" nonce="">(function(){/*

 Copyright The Closure Library Authors.
 SPDX-License-Identifier: Apache-2.0
*/
var aa="function"==typeof Object.defineProperties?Object.defineProperty:function(a,b,c){if(a==Array.prototype||a==Object.prototype)return a;a[b]=c.value;return a};function ba(a){a=["object"==typeof globalThis&&globalThis,a,"object"==typeof window&&window,"object"==typeof self&&self,"object"==typeof global&&global];for(var b=0;b<a.length;++b){var c=a[b];if(c&&c.Math==Math)return c}throw Error("Cannot find global object");}var ca=ba(this);
function da(a,b){if(b)a:{var c=ca;a=a.split(".");for(var d=0;d<a.length-1;d++){var e=a[d];if(!(e in c))break a;c=c[e]}a=a[a.length-1];d=c[a];b=b(d);b!=d&&null!=b&&aa(c,a,{configurable:!0,writable:!0,value:b})}}var ea="function"==typeof Object.create?Object.create:function(a){function b(){}b.prototype=a;return new b},fa;
if("function"==typeof Object.setPrototypeOf)fa=Object.setPrototypeOf;else{var ha;a:{var ia={a:!0},ja={};try{ja.__proto__=ia;ha=ja.a;break a}catch(a){}ha=!1}fa=ha?function(a,b){a.__proto__=b;if(a.__proto__!==b)throw new TypeError(a+" is not extensible");return a}:null}var ka=fa;
function h(a,b){a.prototype=ea(b.prototype);a.prototype.constructor=a;if(ka)ka(a,b);else for(var c in b)if("prototype"!=c)if(Object.defineProperties){var d=Object.getOwnPropertyDescriptor(b,c);d&&Object.defineProperty(a,c,d)}else a[c]=b[c];a.o=b.prototype}da("Object.is",function(a){return a?a:function(b,c){return b===c?0!==b||1/b===1/c:b!==b&&c!==c}});var l=this||self;function la(){}function ma(a){var b=typeof a;return"object"==b&&null!=a||"function"==b}
function na(a,b){var c=Array.prototype.slice.call(arguments,1);return function(){var d=c.slice();d.push.apply(d,arguments);return a.apply(this,d)}}function oa(a,b){function c(){}c.prototype=b.prototype;a.o=b.prototype;a.prototype=new c;a.prototype.constructor=a;a.B=function(d,e,f){for(var g=Array(arguments.length-2),k=2;k<arguments.length;k++)g[k-2]=arguments[k];return b.prototype[e].apply(d,g)}}function pa(a){return a};var qa=Array.prototype.indexOf?function(a,b){return Array.prototype.indexOf.call(a,b,void 0)}:function(a,b){if("string"===typeof a)return"string"!==typeof b||1!=b.length?-1:a.indexOf(b,0);for(var c=0;c<a.length;c++)if(c in a&&a[c]===b)return c;return-1};function ra(a,b,c){for(var d in a)b.call(c,a[d],d,a)};var m;function p(a,b){this.i=a===sa&&b||"";this.j=ta}p.prototype.h=!0;p.prototype.g=function(){return this.i};var ta={},sa={};var ua=String.prototype.trim?function(a){return a.trim()}:function(a){return/^[\s\xa0]*([\s\S]*?)[\s\xa0]*$/.exec(a)[1]},va=/&/g,wa=/</g,xa=/>/g,ya=/"/g,za=/'/g,Aa=/\x00/g,Ba=/[\x00&<>"']/;function Ca(a,b){return a<b?-1:a>b?1:0};function q(a,b){this.i=b===r?a:""}q.prototype.h=!0;q.prototype.g=function(){return this.i.toString()};q.prototype.toString=function(){return this.i.toString()};function u(a){return a instanceof q&&a.constructor===q?a.i:"type_error:SafeUrl"}
var Da=/^(?:audio\/(?:3gpp2|3gpp|aac|L16|midi|mp3|mp4|mpeg|oga|ogg|opus|x-m4a|x-matroska|x-wav|wav|webm)|font\/\w+|image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp|x-icon)|video\/(?:mpeg|mp4|ogg|webm|quicktime|x-matroska))(?:;\w+=(?:\w+|"[\w;,= ]+"))*$/i,Ea=/^data:(.*);base64,[a-z0-9+\/]+=*$/i,Fa=/^(?:(?:https?|mailto|ftp):|[^:/?#]*(?:[/?#]|$))/i;function Ga(a){if(a instanceof q)return a;a="object"==typeof a&&a.h?a.g():String(a);Fa.test(a)||(a="about:invalid#zClosurez");return new q(a,r)}
var r={},Ha=new q("about:invalid#zClosurez",r);var v;a:{var Ia=l.navigator;if(Ia){var Ja=Ia.userAgent;if(Ja){v=Ja;break a}}v=""}function w(a){return-1!=v.indexOf(a)};function x(a,b,c){this.i=c===Ka?a:""}x.prototype.h=!0;x.prototype.g=function(){return this.i.toString()};x.prototype.toString=function(){return this.i.toString()};var Ka={};function La(a,b,c,d){a=a instanceof q?a:Ga(a);b=b||l;c=c instanceof p?c instanceof p&&c.constructor===p&&c.j===ta?c.i:"type_error:Const":c||"";return void 0!==d?b.open(u(a),c,d,void 0):b.open(u(a),c)};function Ma(a){Ma[" "](a);return a}Ma[" "]=la;function y(a,b,c){return Object.prototype.hasOwnProperty.call(a,b)?a[b]:a[b]=c(b)};var Na=w("Opera"),z=w("Trident")||w("MSIE"),Oa=w("Edge"),Pa=Oa||z,Qa=w("Gecko")&&!(-1!=v.toLowerCase().indexOf("webkit")&&!w("Edge"))&&!(w("Trident")||w("MSIE"))&&!w("Edge"),Ra=-1!=v.toLowerCase().indexOf("webkit")&&!w("Edge"),Sa=w("Macintosh");function Ta(){var a=l.document;return a?a.documentMode:void 0}var Ua;
a:{var Va="",Wa=function(){var a=v;if(Qa)return/rv:([^\);]+)(\)|;)/.exec(a);if(Oa)return/Edge\/([\d\.]+)/.exec(a);if(z)return/\b(?:MSIE|rv)[: ]([^\);]+)(\)|;)/.exec(a);if(Ra)return/WebKit\/(\S+)/.exec(a);if(Na)return/(?:Version)[ \/]?(\S+)/.exec(a)}();Wa&&(Va=Wa?Wa[1]:"");if(z){var Xa=Ta();if(null!=Xa&&Xa>parseFloat(Va)){Ua=String(Xa);break a}}Ua=Va}var Ya=Ua,Za={},$a;if(l.document&&z){var ab=Ta();$a=ab?ab:parseInt(Ya,10)||void 0}else $a=void 0;var bb=$a;function cb(a){return y(a.prototype,"$$generatedClassName",function(){return"Class$obf_"+{valueOf:function(){return++db}}})}var db=1E3;function A(){}A.prototype.u=function(){return this.j||(Object.defineProperties(this,{j:{value:++eb,enumerable:!1}}),this.j)};A.prototype.toString=function(){var a=B(fb(gb(this.constructor)))+"@";var b=(this.u()>>>0).toString(16);return a+B(b)};function D(){}h(D,A);D.prototype.i=function(a){this.h=a;if(a instanceof Object)try{a.A=this}catch(b){}};function hb(a){a.h instanceof Error&&(Error.captureStackTrace?Error.captureStackTrace(a.h):a.h.stack=Error().stack)}D.prototype.toString=function(){var a=fb(gb(this.constructor)),b=this.l;return null==b?a:B(a)+": "+B(b)};function ib(){}h(ib,D);function jb(){}h(jb,ib);var eb=0;function E(){}h(E,jb);E.prototype.i=function(a){jb.prototype.i.call(this,Object.is(this.g,"__noinit__")?a:this.g)};function kb(){}h(kb,E);function lb(a,b){return"string"==typeof a?a.charCodeAt(b):a.g(b)};function B(a){return null==a?"null":a.toString()}function mb(a){return 65536<=a?B(String.fromCharCode((55296+((a-65536|0)>>10&1023)|0)&65535))+B(String.fromCharCode((56320+((a-65536|0)&1023)|0)&65535)):String.fromCharCode(a&65535)}function nb(a,b){var c=b,d=a.length,e;b=lb(a,(e=c,c=c+1|0,e));var f;if(e=55296<=b&&56319>=b&&c<d)a=f=lb(a,c),e=56320<=a&&57343>=a;var g;e?g=65536+((b&1023)<<10)+(f&1023)|0:g=b;return g};function ob(a,b){this.h=a;this.g=b}h(ob,A);function fb(a){var b=cb(a.h);0!=a.g&&(b="L"+B(b)+";");a=a.g;for(var c="",d=0;d<a;d=d+1|0)c=B(c)+"[";return B(c)+B(b)}ob.prototype.toString=function(){return"class "+B(fb(this))};function gb(a){var b=0;return y(a.prototype,"$$class/"+b,function(){return new ob(a,b)})};function pb(a,b){return null==a?a:b?decodeURI(a):decodeURIComponent(a)};var qb=/^(?:([^:/?#.]+):)?(?:\/\/(?:([^/?#]*)@)?([^/#?]*?)(?::([0-9]+))?(?=[/#?]|$))?([^?#]+)?(?:\?([^#]*))?(?:#([\S\s]*))?$/;function rb(a){a=qb.exec(a);for(var b=[],c=0;7>=c;c=c+1|0)a.length<=c||null==a[c]?b.push(null):b.push(a[c]);return b}
function sb(a,b){var c=a.indexOf(mb(35));c=0>c?a.length:c;a:{var d=0;for(var e=b.length;0<(d=a.indexOf(b,d))&&d<c;){var f=nb(a,d-1|0);if(38==f||63==f){if((d+e|0)>=a.length)break a;f=nb(a,d+e|0);if(61==f||38==f||35==f)break a}d=d+(e+1)|0}d=-1}if(0>d)return null;e=a.indexOf(mb(38),d);if(0>e||e>c)e=c;d=d+(b.length+1)|0;b=Math.min(a.length,d);a=a.substr(b,Math.min(a.length,Math.max(d,e))-b|0);c=" ";for(b=0;0<=(b=c.indexOf("\\",b));)36==c.charCodeAt(b+1|0)?(d=B(c.substr(0,b|0))+"$",e=b=b+1|0,c=d+B(c.substr(e))):
(d=B(c.substr(0,b|0)),e=b=b+1|0,c=d+B(c.substr(e)));a=a.replace(/\+/g,c);return pb(a,!1)};function F(a,b){this.h=b;for(var c=[],d=!0,e=a.length-1;0<=e;e--){var f=a[e]|0;d&&f==b||(c[e]=f,d=!1)}this.g=c}var tb={};function ub(a){return-128<=a&&128>a?y(tb,a,function(b){return new F([b|0],0>b?-1:0)}):new F([a|0],0>a?-1:0)}function G(a){if(isNaN(a)||!isFinite(a))return H;if(0>a)return I(G(-a));for(var b=[],c=1,d=0;a>=c;d++)b[d]=a/c|0,c*=4294967296;return new F(b,0)}var H=ub(0),J=ub(1),vb=ub(16777216);
function K(a){if(-1==a.h)return-K(I(a));for(var b=0,c=1,d=0;d<a.g.length;d++){var e=L(a,d);b+=(0<=e?e:4294967296+e)*c;c*=4294967296}return b}F.prototype.toString=function(a){a=a||10;if(2>a||36<a)throw Error("radix out of range: "+a);if(M(this))return"0";if(-1==this.h)return"-"+I(this).toString(a);for(var b=G(Math.pow(a,6)),c=this,d="";;){var e=wb(c,b).g;c=N(c,O(e,b));var f=((0<c.g.length?c.g[0]:c.h)>>>0).toString(a);c=e;if(M(c))return f+d;for(;6>f.length;)f="0"+f;d=f+d}};
function L(a,b){return 0>b?0:b<a.g.length?a.g[b]:a.h}function M(a){if(0!=a.h)return!1;for(var b=0;b<a.g.length;b++)if(0!=a.g[b])return!1;return!0}function P(a,b){a=N(a,b);return-1==a.h?-1:M(a)?0:1}function I(a){for(var b=a.g.length,c=[],d=0;d<b;d++)c[d]=~a.g[d];return(new F(c,~a.h)).add(J)}F.prototype.abs=function(){return-1==this.h?I(this):this};
F.prototype.add=function(a){for(var b=Math.max(this.g.length,a.g.length),c=[],d=0,e=0;e<=b;e++){var f=d+(L(this,e)&65535)+(L(a,e)&65535),g=(f>>>16)+(L(this,e)>>>16)+(L(a,e)>>>16);d=g>>>16;f&=65535;g&=65535;c[e]=g<<16|f}return new F(c,c[c.length-1]&-2147483648?-1:0)};function N(a,b){return a.add(I(b))}
function O(a,b){if(M(a)||M(b))return H;if(-1==a.h)return-1==b.h?O(I(a),I(b)):I(O(I(a),b));if(-1==b.h)return I(O(a,I(b)));if(0>P(a,vb)&&0>P(b,vb))return G(K(a)*K(b));for(var c=a.g.length+b.g.length,d=[],e=0;e<2*c;e++)d[e]=0;for(e=0;e<a.g.length;e++)for(var f=0;f<b.g.length;f++){var g=L(a,e)>>>16,k=L(a,e)&65535,t=L(b,f)>>>16,n=L(b,f)&65535;d[2*e+2*f]+=k*n;Q(d,2*e+2*f);d[2*e+2*f+1]+=g*n;Q(d,2*e+2*f+1);d[2*e+2*f+1]+=k*t;Q(d,2*e+2*f+1);d[2*e+2*f+2]+=g*t;Q(d,2*e+2*f+2)}for(e=0;e<c;e++)d[e]=d[2*e+1]<<16|
d[2*e];for(e=c;e<2*c;e++)d[e]=0;return new F(d,0)}function Q(a,b){for(;(a[b]&65535)!=a[b];)a[b+1]+=a[b]>>>16,a[b]&=65535,b++}function S(a,b){this.g=a;this.h=b}
function wb(a,b){if(M(b))throw Error("division by zero");if(M(a))return new S(H,H);if(-1==a.h)return b=wb(I(a),b),new S(I(b.g),I(b.h));if(-1==b.h)return b=wb(a,I(b)),new S(I(b.g),b.h);if(30<a.g.length){if(-1==a.h||-1==b.h)throw Error("slowDivide_ only works with positive integers.");for(var c=J,d=b;0>=P(d,a);)c=xb(c,1),d=xb(d,1);var e=T(c,1),f=T(d,1);d=T(d,2);for(c=T(c,2);!M(d);){var g=f.add(d);0>=P(g,a)&&(e=e.add(c),f=g);d=T(d,1);c=T(c,1)}b=N(a,O(e,b));return new S(e,b)}for(e=H;0<=P(a,b);){c=Math.max(1,
Math.floor(K(a)/K(b)));d=Math.ceil(Math.log(c)/Math.LN2);d=48>=d?1:Math.pow(2,d-48);f=G(c);for(g=O(f,b);-1==g.h||0<P(g,a);)c-=d,f=G(c),g=O(f,b);M(f)&&(f=J);e=e.add(f);a=N(a,g)}return new S(e,a)}F.prototype.and=function(a){for(var b=Math.max(this.g.length,a.g.length),c=[],d=0;d<b;d++)c[d]=L(this,d)&L(a,d);return new F(c,this.h&a.h)};F.prototype.or=function(a){for(var b=Math.max(this.g.length,a.g.length),c=[],d=0;d<b;d++)c[d]=L(this,d)|L(a,d);return new F(c,this.h|a.h)};
F.prototype.xor=function(a){for(var b=Math.max(this.g.length,a.g.length),c=[],d=0;d<b;d++)c[d]=L(this,d)^L(a,d);return new F(c,this.h^a.h)};function xb(a,b){var c=b>>5;b%=32;for(var d=a.g.length+c+(0<b?1:0),e=[],f=0;f<d;f++)e[f]=0<b?L(a,f-c)<<b|L(a,f-c-1)>>>32-b:L(a,f-c);return new F(e,a.h)}function T(a,b){var c=b>>5;b%=32;for(var d=a.g.length-c,e=[],f=0;f<d;f++)e[f]=0<b?L(a,f+c)>>>b|L(a,f+c+1)<<32-b:L(a,f+c);return new F(e,a.h)};N(xb(J,32),J);N(xb(J,128),J);function yb(a){a&&"function"==typeof a.v&&a.v()};function U(){this.h=this.h;this.g=this.g}U.prototype.h=!1;U.prototype.v=function(){this.h||(this.h=!0,this.j())};U.prototype.j=function(){if(this.g)for(;this.g.length;)this.g.shift()()};var zb=!z||9<=Number(bb),Ab=!z||9<=Number(bb),Bb=z&&!y(Za,"9",function(){for(var a=0,b=ua(String(Ya)).split("."),c=ua("9").split("."),d=Math.max(b.length,c.length),e=0;0==a&&e<d;e++){var f=b[e]||"",g=c[e]||"";do{f=/(\d*)(\D*)(.*)/.exec(f)||["","","",""];g=/(\d*)(\D*)(.*)/.exec(g)||["","","",""];if(0==f[0].length&&0==g[0].length)break;a=Ca(0==f[1].length?0:parseInt(f[1],10),0==g[1].length?0:parseInt(g[1],10))||Ca(0==f[2].length,0==g[2].length)||Ca(f[2],g[2]);f=f[3];g=g[3]}while(0==a)}return 0<=a}),
Cb=function(){if(!l.addEventListener||!Object.defineProperty)return!1;var a=!1,b=Object.defineProperty({},"passive",{get:function(){a=!0}});try{l.addEventListener("test",la,b),l.removeEventListener("test",la,b)}catch(c){}return a}();function Db(a,b){this.type=a;this.g=this.target=b;this.defaultPrevented=!1}Db.prototype.h=function(){this.defaultPrevented=!0};function V(a,b){Db.call(this,a?a.type:"");this.relatedTarget=this.g=this.target=null;this.button=this.screenY=this.screenX=this.clientY=this.clientX=0;this.key="";this.metaKey=this.shiftKey=this.altKey=this.ctrlKey=!1;this.state=null;this.pointerId=0;this.pointerType="";this.i=null;if(a){var c=this.type=a.type,d=a.changedTouches&&a.changedTouches.length?a.changedTouches[0]:null;this.target=a.target||a.srcElement;this.g=b;if(b=a.relatedTarget){if(Qa){a:{try{Ma(b.nodeName);var e=!0;break a}catch(f){}e=
!1}e||(b=null)}}else"mouseover"==c?b=a.fromElement:"mouseout"==c&&(b=a.toElement);this.relatedTarget=b;d?(this.clientX=void 0!==d.clientX?d.clientX:d.pageX,this.clientY=void 0!==d.clientY?d.clientY:d.pageY,this.screenX=d.screenX||0,this.screenY=d.screenY||0):(this.clientX=void 0!==a.clientX?a.clientX:a.pageX,this.clientY=void 0!==a.clientY?a.clientY:a.pageY,this.screenX=a.screenX||0,this.screenY=a.screenY||0);this.button=a.button;this.key=a.key||"";this.ctrlKey=a.ctrlKey;this.altKey=a.altKey;this.shiftKey=
a.shiftKey;this.metaKey=a.metaKey;this.pointerId=a.pointerId||0;this.pointerType="string"===typeof a.pointerType?a.pointerType:Eb[a.pointerType]||"";this.state=a.state;this.i=a;a.defaultPrevented&&V.o.h.call(this)}}oa(V,Db);var Fb=[1,4,2],Eb={2:"touch",3:"pen",4:"mouse"};V.prototype.h=function(){V.o.h.call(this);var a=this.i;if(a.preventDefault)a.preventDefault();else if(a.returnValue=!1,Bb)try{if(a.ctrlKey||112<=a.keyCode&&123>=a.keyCode)a.keyCode=-1}catch(b){}};var Gb="closure_listenable_"+(1E6*Math.random()|0);var Hb=0;function Ib(a,b,c,d,e){this.listener=a;this.g=null;this.src=b;this.type=c;this.capture=!!d;this.h=e;this.key=++Hb;this.m=this.s=!1}function Jb(a){a.m=!0;a.listener=null;a.g=null;a.src=null;a.h=null};function Kb(a){this.src=a;this.g={};this.h=0}Kb.prototype.add=function(a,b,c,d,e){var f=a.toString();a=this.g[f];a||(a=this.g[f]=[],this.h++);var g;a:{for(g=0;g<a.length;++g){var k=a[g];if(!k.m&&k.listener==b&&k.capture==!!d&&k.h==e)break a}g=-1}-1<g?(b=a[g],c||(b.s=!1)):(b=new Ib(b,this.src,f,!!d,e),b.s=c,a.push(b));return b};function Lb(a,b){var c=b.type;if(c in a.g){var d=a.g[c],e=qa(d,b),f;(f=0<=e)&&Array.prototype.splice.call(d,e,1);f&&(Jb(b),0==a.g[c].length&&(delete a.g[c],a.h--))}};var Mb="closure_lm_"+(1E6*Math.random()|0),Nb={},Ob=0;function Pb(a,b,c,d,e){if(d&&d.once)return Qb(a,b,c,d,e);if(Array.isArray(b)){for(var f=0;f<b.length;f++)Pb(a,b[f],c,d,e);return null}c=Rb(c);return a&&a[Gb]?a.g.add(String(b),c,!1,ma(d)?!!d.capture:!!d,e):Sb(a,b,c,!1,d,e)}
function Sb(a,b,c,d,e,f){if(!b)throw Error("Invalid event type");var g=ma(e)?!!e.capture:!!e,k=Tb(a);k||(a[Mb]=k=new Kb(a));c=k.add(b,c,d,g,f);if(c.g)return c;d=Ub();c.g=d;d.src=a;d.listener=c;if(a.addEventListener)Cb||(e=g),void 0===e&&(e=!1),a.addEventListener(b.toString(),d,e);else if(a.attachEvent)a.attachEvent(Vb(b.toString()),d);else if(a.addListener&&a.removeListener)a.addListener(d);else throw Error("addEventListener and attachEvent are unavailable.");Ob++;return c}
function Ub(){var a=Wb,b=Ab?function(c){return a.call(b.src,b.listener,c)}:function(c){c=a.call(b.src,b.listener,c);if(!c)return c};return b}function Qb(a,b,c,d,e){if(Array.isArray(b)){for(var f=0;f<b.length;f++)Qb(a,b[f],c,d,e);return null}c=Rb(c);return a&&a[Gb]?a.g.add(String(b),c,!0,ma(d)?!!d.capture:!!d,e):Sb(a,b,c,!0,d,e)}
function Xb(a){if("number"!==typeof a&&a&&!a.m){var b=a.src;if(b&&b[Gb])Lb(b.g,a);else{var c=a.type,d=a.g;b.removeEventListener?b.removeEventListener(c,d,a.capture):b.detachEvent?b.detachEvent(Vb(c),d):b.addListener&&b.removeListener&&b.removeListener(d);Ob--;(c=Tb(b))?(Lb(c,a),0==c.h&&(c.src=null,b[Mb]=null)):Jb(a)}}}function Vb(a){return a in Nb?Nb[a]:Nb[a]="on"+a}
function Yb(a,b,c,d){var e=!0;if(a=Tb(a))if(b=a.g[b.toString()])for(b=b.concat(),a=0;a<b.length;a++){var f=b[a];f&&f.capture==c&&!f.m&&(f=Zb(f,d),e=e&&!1!==f)}return e}function Zb(a,b){var c=a.listener,d=a.h||a.src;a.s&&Xb(a);return c.call(d,b)}
function Wb(a,b){if(a.m)return!0;if(!Ab){if(!b)a:{b=["window","event"];for(var c=l,d=0;d<b.length;d++)if(c=c[b[d]],null==c){b=null;break a}b=c}d=b;b=new V(d,this);c=!0;if(!(0>d.keyCode||void 0!=d.returnValue)){a:{var e=!1;if(0==d.keyCode)try{d.keyCode=-1;break a}catch(g){e=!0}if(e||void 0==d.returnValue)d.returnValue=!0}d=[];for(e=b.g;e;e=e.parentNode)d.push(e);a=a.type;for(e=d.length-1;0<=e;e--){b.g=d[e];var f=Yb(d[e],a,!0,b);c=c&&f}for(e=0;e<d.length;e++)b.g=d[e],f=Yb(d[e],a,!1,b),c=c&&f}return c}return Zb(a,
new V(b,this))}function Tb(a){a=a[Mb];return a instanceof Kb?a:null}var $b="__closure_events_fn_"+(1E9*Math.random()>>>0);function Rb(a){if("function"===typeof a)return a;a[$b]||(a[$b]=function(b){return a.handleEvent(b)});return a[$b]};function W(a){U.call(this);this.l=a;this.i={}}oa(W,U);var ac=[];function bc(a){ra(a.i,function(b,c){this.i.hasOwnProperty(c)&&Xb(b)},a);a.i={}}W.prototype.j=function(){W.o.j.call(this);bc(this)};W.prototype.handleEvent=function(){throw Error("EventHandler.handleEvent not implemented");};function cc(a){U.call(this);this.i=a||document.body;this.l=new W(this);a=na(yb,this.l);this.h?a():(this.g||(this.g=[]),this.g.push(a));a=this.l;var b=this.i,c=this.u,d="click";Array.isArray(d)||(d&&(ac[0]=d.toString()),d=ac);for(var e=0;e<d.length;e++){var f=Pb(b,d[e],c||a.handleEvent,!1,a.l||a);if(!f)break;a.i[f.key]=f}}h(cc,U);
cc.prototype.u=function(a){if(!(!(zb?0==a.i.button:"click"==a.type||a.i.button&Fb[0])||Sa&&a.ctrlKey||a.defaultPrevented))for(var b=a.target;b&&b!=this.i;){if(b.tagName&&"a"==b.tagName.toLowerCase()){var c=b.getAttribute("href")||b.getAttributeNS("http://www.w3.org/1999/xlink","href"),d=c;try{var e=rb(c)[3];var f;if(f="www.google.com"===pb(e,!0)){var g=rb(c)[5];f="/url"===pb(g,!0)}if(f){var k=sb(c,"q");d=k?k:sb(c,"url")}}catch(C){a:{var t=C;if(null!=t){var n=t.A;if(null!=n){C=n;break a}}if(t instanceof
TypeError){var R=n=new kb;R.l=B(t);hb(R);n.g="__noinit__";n.g=t;n.i(new TypeError(n));t=n}else R=n=new E,R.l=B(t),hb(R),n.g="__noinit__",n.g=t,n.i(Error(n)),t=n;C=t}if(!(C instanceof ib))throw C.h;}d=null!=d?d:"";if(c!=d){e=void 0;b={target:"_blank",noreferrer:!0};c=window;d instanceof q?f=d:(f="undefined"!=typeof d.href?d.href:String(d),f instanceof q||(f="object"==typeof f&&f.h?f.g():String(f),Fa.test(f)?f=new q(f,r):(f=String(f),f=f.replace(/(%0A|%0D)/g,""),f=(g=f.match(Ea))&&Da.test(g[1])?new q(f,
r):null)),f=f||Ha);d=b.target||d.target;g=[];for(e in b)switch(e){case "width":case "height":case "top":case "left":g.push(e+"="+b[e]);break;case "target":case "noopener":case "noreferrer":break;default:g.push(e+"="+(b[e]?1:0))}e=g.join(",");if((w("iPhone")&&!w("iPod")&&!w("iPad")||w("iPad")||w("iPod"))&&c.navigator&&c.navigator.standalone&&d&&"_self"!=d)e="A",g=document,e=String(e),"application/xhtml+xml"===g.contentType&&(e=e.toLowerCase()),g=e=g.createElement(e),f=f instanceof q?f:Ga(f),g.href=
u(f),e.setAttribute("target",d),b.noreferrer&&e.setAttribute("rel","noreferrer"),b=document.createEvent("MouseEvent"),b.initMouseEvent("click",!0,!0,c,1),e.dispatchEvent(b);else if(b.noreferrer){if(c=La("",c,d,e),b=u(f),c){Pa&&-1!=b.indexOf(";")&&(b="'"+b.replace(/'/g,"%27")+"'");c.opener=null;Ba.test(b)&&(-1!=b.indexOf("&")&&(b=b.replace(va,"&amp;")),-1!=b.indexOf("<")&&(b=b.replace(wa,"&lt;")),-1!=b.indexOf(">")&&(b=b.replace(xa,"&gt;")),-1!=b.indexOf('"')&&(b=b.replace(ya,"&quot;")),-1!=b.indexOf("'")&&
(b=b.replace(za,"&#39;")),-1!=b.indexOf("\x00")&&(b=b.replace(Aa,"&#0;")));b='<meta name="referrer" content="no-referrer"><meta http-equiv="refresh" content="0; url='+b+'">';if(void 0===m)if(d=null,(e=l.trustedTypes)&&e.createPolicy){try{d=e.createPolicy("goog#html",{createHTML:pa,createScript:pa,createScriptURL:pa})}catch(C){l.console&&l.console.error(C.message)}m=d}else m=d;b=(d=m)?d.createHTML(b):b;b=new x(b,null,Ka);(c=c.document)&&c.write&&(c.write(b instanceof x&&b.constructor===x?b.i:"type_error:SafeHtml"),
c.close())}}else(c=La(f,c,d,e))&&b.noopener&&(c.opener=null);a.h();break}}b=b.parentNode}};function dc(a){new cc(a)}var X=["DOCS_installLinkReferrerSanitizer"],Y=l;X[0]in Y||"undefined"==typeof Y.execScript||Y.execScript("var "+X[0]);for(var Z;X.length&&(Z=X.shift());)X.length||void 0===dc?Y[Z]&&Y[Z]!==Object.prototype[Z]?Y=Y[Z]:Y=Y[Z]={}:Y[Z]=dc;}).call(this);
</script><script type="text/javascript" nonce="">DOCS_installLinkReferrerSanitizer();</script></body></html>